package com.chatmcp.mcprouter.jsonrpc;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * JSON-RPC错误类
 * 表示JSON-RPC 2.0错误对象
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class JsonRpcError {

    /**
     * 错误码
     */
    private int code;

    /**
     * 错误消息
     */
    private String message;

    /**
     * 错误数据（可选）
     */
    private Object data;

    /**
     * 解析错误
     */
    public static JsonRpcError parseError() {
        return new JsonRpcError(-32700, "Parse error", null);
    }

    /**
     * 无效请求
     */
    public static JsonRpcError invalidRequest() {
        return new JsonRpcError(-32600, "Invalid Request", null);
    }
    
    /**
     * 无效请求（带自定义消息）
     */
    public static JsonRpcError invalidRequest(String message) {
        return new JsonRpcError(-32600, message != null ? message : "Invalid Request", null);
    }

    /**
     * 方法不存在
     */
    public static JsonRpcError methodNotFound() {
        return new JsonRpcError(-32601, "Method not found", null);
    }
    
    /**
     * 方法不存在（带自定义消息）
     */
    public static JsonRpcError methodNotFound(String method) {
        return new JsonRpcError(-32601, "Method not found: " + method, null);
    }

    /**
     * 无效参数
     */
    public static JsonRpcError invalidParams() {
        return new JsonRpcError(-32602, "Invalid params", null);
    }
    
    /**
     * 无效参数（带自定义消息）
     */
    public static JsonRpcError invalidParams(String message) {
        return new JsonRpcError(-32602, message != null ? message : "Invalid params", null);
    }

    /**
     * 内部错误
     */
    public static JsonRpcError internalError() {
        return new JsonRpcError(-32603, "Internal error", null);
    }
    
    /**
     * 内部错误（带自定义消息）
     */
    public static JsonRpcError internalError(String message) {
        return new JsonRpcError(-32603, message != null ? message : "Internal error", null);
    }

    /**
     * 代理错误（匹配Go版本的错误信息）
     */
    public static JsonRpcError proxyError() {
        return new JsonRpcError(-32000, "Proxy error, Please restart client", null);
    }
    
    /**
     * 代理错误（带自定义消息）
     */
    public static JsonRpcError proxyError(String message) {
        return new JsonRpcError(-32000, message != null ? message : "Proxy error, Please restart client", null);
    }
    
    /**
     * 代理错误（带数据）
     */
    public static JsonRpcError proxyError(String message, Object data) {
        return new JsonRpcError(-32000, message != null ? message : "Proxy error, Please restart client", data);
    }

    /**
     * 服务器错误
     *
     * @param code   错误码（-32000至-32099之间）
     * @param message 错误消息
     * @return JSON-RPC错误
     */
    public static JsonRpcError serverError(int code, String message) {
        if (code < -32099 || code > -32000) {
            throw new IllegalArgumentException("Server error code must be between -32099 and -32000");
        }
        return new JsonRpcError(code, message, null);
    }
    
    /**
     * 服务器错误（带数据）
     *
     * @param code    错误码（-32000至-32099之间）
     * @param message 错误消息
     * @param data    错误数据
     * @return JSON-RPC错误
     */
    public static JsonRpcError serverError(int code, String message, Object data) {
        if (code < -32099 || code > -32000) {
            throw new IllegalArgumentException("Server error code must be between -32099 and -32000");
        }
        return new JsonRpcError(code, message, data);
    }
    
    /**
     * 创建一个新的JSON-RPC错误
     *
     * @param code    错误码
     * @param message 错误消息
     * @param data    错误数据
     * @return JSON-RPC错误
     */
    public static JsonRpcError newError(int code, String message, Object data) {
        return new JsonRpcError(code, message, data);
    }
    
    /**
     * 返回错误的字符串表示
     *
     * @return 错误的字符串表示
     */
    public String getErrorString() {
        return "[" + code + "] " + message;
    }
} 